/**
 * \file SUnite.c
 * \author Catalin BLAJ
 * \author Vincent JACQUEMIN
 * \date 18 Octobre 2013
 *
 * Fichier source SUnite.c pour le programme du Sudoku.
 */


#include "SUnite.h"

SUnite* SU_initialiser(unsigned char type)
{
    /* Variables de convenance */
    unsigned nombreCases = type*type;

    /* Vérification des paramètres */
    assert(type>=2 && type<=4);

    /* Allocation mémoire et affectation des champs de structure */
    SUnite* unite = (SUnite*) malloc(sizeof(SUnite));
    unite->type = type;
    unite->cases = (SCase**) malloc(nombreCases*sizeof(SCase*));

    /* On retourne l'unité correctement allouée */
    return unite;
}


void SU_testament(SUnite* unite)
{
    /* Vérification des paramètres */
    assert(unite != NULL);

    /* On libère l'espace alloué */
    free(unite->cases);
    free(unite);
}


unsigned char SU_getType(const SUnite* unite)
{
    /* Vérification des paramètres */
    assert(unite != NULL);

    /* On renvoit le type de Sudoku */
    return unite->type;
}


SCase* SU_getCase(const SUnite* unite, unsigned short indice)
{
    /* Variables de convenance */
	unsigned char type = SU_getType(unite);
	unsigned nombreCases = type*type;

	/* Vérification des paramètres */
    assert(unite != NULL);
    assert (indice < nombreCases);

    /* On renvoit le pointeur de la case cherchée */
	return unite->cases[indice];
}


void SU_setCase(SUnite* unite, unsigned short indice, SCase* nouvelleCase)
{
    /* Variables de convenance */
    unsigned char type = SU_getType(unite);
	unsigned nombreCases = pow(type, 2);

    /* Vérification des paramètres */
	assert(unite != NULL);
	assert(indice < nombreCases);

	/* Si ajoute la case dans l'unite */
	unite->cases[indice] = nouvelleCase;
}
